home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.whtech.com
/
ftp.whtech.com.tar
/
ftp.whtech.com
/
datasheets and manuals
/
Hardware
/
WHT
/
scsi
/
dsr_sources_2_2001
/
load
< prev
next >
Wrap
Text File
|
2006-10-19
|
5KB
|
216 lines
* I/O op code 5 - LOAD
*
* This routine loads a program file into the users buffer
*
LOAD0 ANDI R12,>FF00
AI R12,24
BL @GETFDR
CI R5,0 See if the file exists
JNE LOAD1
* If we were doing DSK emulation, go on to the next device
*
ANDI R6,>00FF
JEQ LOAD0A
LDCR @ZERO,4
DECT @SAVR11
B @DSRRT
LOAD0A BL @DSRERR
DATA >0700 File Error
* Check the file header to make sure it has the characters
* 'FI' in bytes 28 and 29
*
* We no longer check for 'FI' because the Myarc does not
* always put it in there.
LOAD1
LDCR @ZERO,4
* MOV @28(R5),R1
* CI R1,'FI'
* JEQ LOAD2
* BL @DSRERR
* DATA >0700 File Error
* Make sure it is a program file
*
LOAD2
MOVB @12(R5),R1
ANDI R1,>0100
JNE LOAD3
BL @DSRERR
DATA >0200 Bad Open Attribute
* Copy the FDR from the SCSI buffer to DFDR
LOAD3 LI R2,DFDR
LI R3,32
LOAD4 MOV *R5+,R4
MOV *R5+,R7
MOV *R5+,R8
MOV *R5+,R9
LDCR @B02,4 Select RAM bank 2
MOV R4,*R2+
MOV R7,*R2+
MOV R8,*R2+
MOV R9,*R2+
LDCR @ZERO,4 Select RAM bank 0
DEC R3
JNE LOAD4
MOV @PABBUF+2,R10 Get VDP buffer address
* Compute the number of bytes in the file
*
LDCR @B02,4 Select RAM bank 2
MOV @DFDR+14,R5 Get number of sectors used by the file
JEQ LOAD99 Exit if it is an empty file
DEC R5
MOVB @DFDR+16,R5 Get End of File offset
JNE LOAD5
INC R5
LOAD5 SWPB R5
* See if the user's buffer is big enough to store the entire
* file. If it isn't, we will decrease the number of bytes
* we read accordingly.
*
LDCR @ZERO,4
C R5,@PABBUF+6
JL LOAD6
MOV @PABBUF+6,R5
JEQ LOAD99 Exit if buffer is zero bytes long
LOAD6
* Set up the rest of the registers. They are used as follows:
*
* R1 - Points to data chain in the FDR
* R2 - Current AU that we're reading
* R3 - Current sector within the AU
* R5 - Number of bytes remaining to be read
* R10 - Buffer address in VDP or CPU memory
* R11 - # of sectors per AU on this disk
*
LDCR @B04,4 Select RAM bank 4
MOV R6,R4 Get drive #
SRL R4,8
SLA R4,1
MOV @SAUTBL(R4),R11
LDCR @B02,4 Select RAM bank 2
LI R1,DFDR+40 Point to data chain
LOAD8 MOV *R1+,R2 Get 1st AU of the file
LOAD9 CLR R3
* Now begin reading sectors from the file until we have
* read all the bytes in the file!
*
LOAD10 MOV R2,R7 Get AU we need to read
MPY R11,R7 Convert AU to sector
A R3,R8 Add in sector within AU
JNC LOAD11
INC R7
LOAD11 LI R4,SECBUF
SRL R8,1 Convert sector to block #
JNC LOAD12
AI R4,>100
LOAD12 SRL R7,1
JNC LOAD13
AI R8,>8000
* Now check to see if we can read the read a 512 byte block
* directly into VDP RAM. If so, we will use sector I/O
* routines to read the data. Otherwise, we use BANKIT to
* store the data in SECBUF first.
*
* We can do 512 bytes if -
* a) There are at least 512 bytes left to read in the file
* b) We start reading in the 1st half of SECBUF
* c) The 2nd half of SECBUF contains nect 256 bytes of file
*
LOAD13
LDCR @ZERO,4
CI R5,512 See how much is left to read
JL LOAD14
CI R4,SECBUF
JNE LOAD14
MOV R11,R9
S R3,R9
CI R9,1
JNE LOAD20
* Well, it didn't work out. We have to read the 512 byte
* block into SECBUF and copy it to VDP memory from there.
*
LOAD14 BLWP @BANKIT Read the block from the disk
DATA SCSIRD
JEQ LOAD15
BL @DSRERR
DATA >0600 Device error
LOAD15 MOV R10,R0 Set VDP write address
ORI R0,>4000
SWPB R0
MOVB R0,@VDPWA Maybe MOVB R0,*R15?
SWPB R0
MOVB R0,@VDPWA
LI R0,256
A R0,R10 Adjust buffer pointer
LOAD16 MOVB *R4+,@VDPWD Copy the sector to the user's buffer
DEC R5
JEQ LOAD99 See if we're done
DEC R0
JNE LOAD16
INC R3
LOAD17
C R3,R11 See if we've read all the sectors in this AU
JL LOAD10 If not, go back and keep reading
LDCR @B02,4 Select RAM bank 2
C R2,*R1 See if we're at the last AU in this cluster
JEQ LOAD18 If so, go to next cluster
INC R2 Otherwise, go to next AU
JMP LOAD9
LOAD18 INCT R1 Go to next cluster
JMP LOAD8
LOAD99 BL @DSRERR
DATA 0 No error
**
*
* LOAD20
*
* This is where we use sector I/O to read 512 bytes
* directly from the SCSI drive to VDP memory.
*
**
LOAD20
MOV R6,R0 Get SCSI ID
ORI R0,>4000 Set sector size and VDP memory
* AI R0,>100
MOVB R0,@>834C
MOVB @B01,@>834D Read
MOV R10,@>834E Buffer address
MOV R8,@>8350 Sector to read
MOV R7,@>8352 " "
BLWP @BANKIT
DATA SCSI20
AI R5,-512 Adjust # of bytes left to read
JEQ LOAD99
AI R10,512 Adjust buffer pointer
INCT R3
JMP LOAD17